package com.bo.controller;

import com.bo.anno.Log;
import com.bo.pojo.Dept;
import com.bo.pojo.Result;
import com.bo.service.DeptService;
import com.bo.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author huangbo
 * @version 1.0.0
 */
//@Slf4j
//@RestController
//public class DeptController {
//    @Autowired
//    private DeptService deptService;
//
//    //查询全部部门
////    @RequestMapping(value = "/depts") //不指定请求方式
////    @RequestMapping(value = "/depts",method = RequestMethod.GET)  //指定请求方式为GET
//    @GetMapping("/depts") //指定请求方式为GET， 使用GetMapping注解更加简洁
//    public Result list(){
////        System.out.println("查询全部的部门数据");
//        log.info("查询全部的部门数据");
//        List<Dept> deptList=deptService.list();
//        return Result.success(deptList);
//    }
//
//    //删除部门  另注：实际开发一般使用软删除，而非直接删除，一般有个字段为isDeleted 删除时将其更新为true即可
//    @DeleteMapping("/depts/{id}")
//    public Result delete(@PathVariable Integer id){     //路径参数需要借助注解@PathVariable
//        log.info("删除指定id="+id+"的部门数据");
//        deptService.delete(id);
//        return Result.success();
//    }
//
//    //增加部门
//    @PostMapping("/depts")
//    public Result add(@RequestBody Dept dept){  //前端的Json数据需要使用对象来接收，借助注解@RequestBody
//        log.info("添加name="+dept.getName()+"的部门数据");
//        deptService.add(dept);
//        return Result.success();
//    }
//}

//另外，考虑到目前所有的请求路径都是以 "/depts" 开头的，所以可以提取出来，进一步简化，如下:
    //另注：实际开发中前面的路径可能非常长，因此提取出公共部分反而有利于代码可读性
@Slf4j
@RestController
@RequestMapping("/depts")   //==简化，公共路径==
public class DeptController {
    @Autowired
    private DeptService deptService;
    @Autowired
    private EmpService empService;

    //查询全部部门
//    @RequestMapping(value = "/depts") //不指定请求方式
//    @RequestMapping(value = "/depts",method = RequestMethod.GET)  //指定请求方式为GET
    @GetMapping //指定请求方式为GET， 使用GetMapping注解更加简洁
    public Result list(){
//        System.out.println("查询全部的部门数据");
        log.info("查询全部的部门数据");
        List<Dept> deptList=deptService.list();
        return Result.success(deptList);
    }

    //删除部门  另注：实际开发一般使用软删除，而非直接删除，一般有个字段为isDeleted 删除时将其更新为true即可
    @Log
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Integer id){     //路径参数需要借助注解@PathVariable
        log.info("删除指定id="+id+"的部门数据");
        deptService.delete(id);
        return Result.success();
    }

    //删除部门进阶_删除时同时删除员工表中关联的数据
    @Log
    @Transactional(rollbackFor = Exception.class)  //Spring 事务管理，且指定所有异常都进行回滚
    @DeleteMapping("/pro/{id}")
    public Result deletePro(@PathVariable Integer id){     //路径参数需要借助注解@PathVariable
        log.info("先删除指定id="+id+"的部门数据，再删除关联的员工信息");
        deptService.delete(id);
        int tmp = 1/0;  //抛出异常，如果没有进行事务回滚，则只会删除部门而不会删除相关的员工信息，不符合预期

        empService.deletepro(id);
        return Result.success();
    }

    //增加部门
    @Log
    @PostMapping
    public Result add(@RequestBody Dept dept){  //前端的Json数据需要使用对象来接收，借助注解@RequestBody 包括了name
        log.info("添加name="+dept.getName()+"的部门数据");
        deptService.add(dept);
        return Result.success();
    }

    //根据id查询部门信息
    @GetMapping("/{id}")
    public Result find(@PathVariable Integer id){//同理，记得加上注解@PathVariable
        log.info("查询id="+id+"的部门");
        Dept dept = deptService.find(id);
        return Result.success(dept);
    }


    //修改部门信息
    @Log
    @PutMapping
    public Result update(@RequestBody Dept dept){   //接收前端json数据，包括了id (new)name
        deptService.update(dept);
        return Result.success();
    }
}